#!/bin/perl
# Leandro Linardos | 89567

###############################################################################
#
# Código destinado a salida, lease, stdout o archivo.
#
###############################################################################

#
# Muestra el mensaje de ayuda
#
sub show_help_msg {
    print "Comando de reporte de beneficiarios suceptible a filtros por \n";
    print "agencia, beneficio y estado.\n";
    print "\n";
    print "MODO DE EMPLEO:\n";
    print "    ./plist.pl [OPCIONES]\n";
    print "\n";
    print "OPCIONES:\n";
    print "    -c:  muestra matriz de control.\n";
    print "    -e: Filtro por estado (solo con -c.):\n";
    print "             a: aprobados\n";
    print "             p: pendientes\n";
    print "             r: rechazados\n";
    print "         o combinación.\n";
    print "    -t:  corrida de prueba solo por STDOUT.\n";
    print "    -d:  corrida definitiva respaldada a archivo.\n";
    print "    -f:  archivos de beneficiarios agrupados entre comillas (\"\").\n";
    print "    -a:  ID de agencias a filtrar agrupadas entre comillas (\"\").\n";
    print "    -b:  ID de beneficios a filtrar agrupados entre comillas (\"\").\n";
    print "\n";
    print "EJEMPLO:\n";
    print "    ./plist.pl -td -f \"benef.0001 benef.0005\" -b \"1 13 15\" -a\"1 2 21\"\n";
    print "     muestra por STDOUT y crea un archivo con los beneficiarios de benef.0001\n";
    print "     benef.0002 para los beneficios 1, 13 y 15 y las agencias 1, 2 y 21.\n";
    print "\n";
}


#
# Devuelve el total de beneficiarios de la lista pasada como argumento
#   
# @args:
#   0: referencia al array parcial de beneficiarios.
#
sub get_total_listed_beneficiaries {
    local *filtered_benef = $_[0];
    my $value = $#filtered_benef + 1;
    return "Total de beneficiarios listados: $value\n";
}


#
# Devuelve la fecha con fomato dia-mes-año, hora:minutos:seg
#
# @retorno: la fecha con el formato antes descripto
#
sub get_date {
    my @months = qw(Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic);
    my ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek,
        $dayOfYear, $daylightSavings) = localtime();
    my $year = 1900 + $yearOffset;
    my $time = sprintf("%02d-%s-%d, %02d:%02d:%02d", $dayOfMonth, 
                       $months[$month],$year,$hour,$minute,$second);
    return $time; 
}


#
# Devuelve el encabezado: fecha y hora, usuario y comando invocado
#
sub get_header {
    my $date = get_date();
    my $user = getlogin();
    return "$date | $user | $COMMAND_INVOQUED\n";
}


#
# Muestra el listado de beneficiarios en STDOUT
#
# @args:
#   0. referencia al array de beneficiarios a mostrar
#   1. archivo de salida
#
sub show_beneficiaries_list {
    local *filtered_benef = $_[0];

    printf("%12s|%12s|%20s|%20s|%20s|%20s|%20s|\n", "Beneficio ID", 
                "Agencia ID", "Cuil", "Apellido", "Provincia", 
                "Fecha Efec. Alta", "Estado");
    foreach (@filtered_benef) {   
        my $actual = $_;
        printf("%12s|%12s|%20s|%20s|%20s|%20s|%20s|\n", $$actual[0], 
                $$actual[1], $$actual[2], $$actual[3], $$actual[4], 
                $$actual[5], $$actual[6]);
    }
}


#
# Muestra el informe final en STDOUT
#
# @args:
#   0. array de beneficiarios ya filtrados
#   1. filehandler de salida
#
sub show_results {
    local *filtered_beneficiaries = $_[0];
    my $header = get_header();
    my $count = get_total_listed_beneficiaries(*filtered_beneficiaries);

    print "$header\n";
    do show_beneficiaries_list(*filtered_beneficiaries);
    print "$count\n";
}


#
# Muestra la información de error y termina.
#
sub show_error_info_and_exit {
    print STDERR "ERROR STATUS($ERROR_STATUS): $ERROR[$ERROR_STATUS] \n$ERROR_MSG\n";
    print STDERR "Ver ayuda: ./plist.pl -h\n" if $ERROR_STATUS != 0;
    exit;
}


#
# Devuelve la matriz de control
#
# args:
#   0. Referencia al hash de control
#   1. Referencia al hash de provincias
#   2. Referencia al hash de beneficios
#
sub get_control_matrix {
    my $matrix = sprintf "Matriz de control: \n";
    local *control = $_[0];
    local *provinces = $_[1];
    local *benefits = $_[2];
    
    my @partials_benefits = ();    

    #cabecera
    $matrix .= sprintf "Prov\\BenefID\t";
    for my $benefit (keys %benefits) {
        $matrix .= sprintf "$benefit\t"
    }
    $matrix .= sprintf "total\n";

    for my $province ( keys %provinces ) {
        $matrix .= sprintf "$province\t";
        my $cont = 0;
        my $partial_provinces = 0;
        for my $benefit ( keys %benefits ) {
            my $key = "$province.$benefit";
            my $value = 0;
            $value = $control{$key} if defined $control{$key};
            $matrix .= sprintf "$value\t";
            $partial_provinces += $value;
            $partials_benefits[$cont] += $value;
            $cont++;
        }
        $matrix .= sprintf "$partial_provinces\n";
    }
    $matrix .= sprintf "total\t\t";
    my $last_cell = 0;
    for(my $i=0; $i <= $#partials_benefits; $i++) {
        my $value = $partials_benefits[$i];
        $matrix .= sprintf "$value\t";
        $last_cell += $value;
    }
    $matrix .= sprintf "$last_cell\n\n";
    return $matrix;
}


#
# Reporte contra archivo de salida.
# Distinto a STDOUT para poder filtrarlo con comándos filtros facilmente.
#
sub report_output_file {
    local *filtered_beneficiaries = $_[0];
    my $path = $_[1];

    my $header = get_header();
    my $count = get_total_listed_beneficiaries(*filtered_beneficiaries);

    open OUTPUT, "+>$path" or die "ERROR AL ABRIR $path\n";

    print OUTPUT "$header\n";
    foreach (@filtered_beneficiaries) {   
        my $actual = $_;
        my $line = join(", ", @$actual);
        print OUTPUT "$line\n";
    }
    print OUTPUT "\n";
    print OUTPUT "$count\n";

    close OUTPUT;

    print "Reporte almacenado en: $path\n";
}

1; # return value = true pedido por Perl
